package com.egg.common.mybatis.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.egg.common.core.model.entity.BaseEntity;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Optional;


public interface IBaseService<T> extends IService<T> {

    /*
       拼接 or 条件
       QueryWrapper<T> qw = new QueryWrapper<T>();
       qw.eq("field1", value1);
       qw.and(wrapper -> wrapper.eq("field2", value2).or().eq("field3", value3));
       select * from t where field1 = value1 and ( field2 = value2 or field3 = value3)
    */
    /*
       拼接 所有子集查询
       ancestors : 所有的上级ID; 用英文逗号,分割
       QueryWrapper<T> qw = new QueryWrapper<T>();
       qw.and(wrapper -> {
            wrapper.in(TableObject::getId, ids);
            for (Serializable id : ids) {
                wrapper.or().apply(String.format("find_in_set(%s, ancestors)", id));
            }
        });
    */

    /*
      无法保存值为null或空字符串的字段, 需要保存null或空字符串字段可以使用以下示例

      UpdateWrapper<T> uq = new UpdateWrapper();   //T 实体对象
      uq.set(SqlField.UPDATE_BY, userId);          //更新人
      uq.set("xxx_xxx", null);                     //null值
      uq.set("xxx_xxx", '业务属性值');              //业务属性
      uq.eq(SqlField.ID, '1L');                    //where 条件
      update(uq);                                  //执行
     */

    LambdaQueryWrapper<T> buildLambdaQw();

    LambdaQueryWrapper<T> buildLambdaSortQw();

    /**
     * 获取表名
     *
     * @param clazz
     * @return
     */
    String getTableName(Class<?> clazz);

    /**
     * 构建存在条件sql语句
     *
     * @param outTableClass 外表
     * @param outField      外表字段
     * @param inTableClass  内表
     * @param inField       内表字段
     * @return
     */
    StringBuilder buildExistsSqlStr(
            Class<? extends BaseEntity> outTableClass
            , String outField
            , Class<? extends BaseEntity> inTableClass
            , String inField
    );

    /**
     * 构建存在条件sql语句
     *
     * @param outTableName 外表
     * @param outField     外表字段
     * @param inTableName  内表
     * @param inField      内表字段
     * @return
     */
    StringBuilder buildExistsSqlStr(
            String outTableName
            , String outField
            , String inTableName
            , String inField
    );

    /**
     * 保存
     * -- 用于不确定是否存在数据的情况下
     * -- 无法覆盖值为null的字段
     *
     * @param info
     * @return
     */
    boolean baseSave(T info);

    /**
     * 保存
     * -- 用于不确定是否存在数据的情况下
     *
     * @param list
     * @return
     */
    boolean baseSave(Collection<? extends T> list);

    /**
     * 新增
     *
     * @param info
     */
    boolean baseAdd(T info);

    boolean baseAdd(Collection<? extends T> list);

    /**
     * 更新
     * -- 无法覆盖值为null的字段
     *
     * @param info
     */
    boolean baseEdit(T info);

    boolean baseEdit(Collection<? extends T> list);

    /**
     * 删除
     *
     * @param id
     * @return
     */
    boolean baseDel(Serializable id);

    boolean baseDel(Collection<? extends Serializable> ids);

    /**
     * 查询
     *
     * @param id
     * @return
     */
    Optional<T> baseFindById(Serializable id);

    List<T> baseFindById(Collection<? extends Serializable> id);

    /**
     * 获取
     * -- 如果不存在内部会抛出异常
     *
     * @param id
     * @return
     */
    T baseGetById(Serializable id);


}
